home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 1.iso / ARGONET / PD / DESKTOP / SWIPE.ZIP / !Swipe / !RunImage (.txt) < prev    next >
RISC OS BBC BASIC V Source  |  1998-10-25  |  14KB  |  541 lines

  1.  Swipe
  2.  Thomas Leonard
  3.  Program and modifications requested by Jon Wright (Jonix)
  4.  Version 0.01 - First test version (useable).
  5.  (23/10/97)
  6.  Version 0.02 - Can grab from non-indirected window titles.
  7.  (25/10/97)     Colour scheme now black/white.
  8.  Version 0.03 - Added save icon which can be dragged to save.
  9.  (30/10/97)     Can also swipe right to left now.
  10.  Version 0.04 - Moved text icon to the left.
  11.  (01/11/97)     Double click selects a whole word.
  12.                 Dragging with nothing selected the whole string is saved.
  13.  Version 0.05 - String width calculations now work for pre-RO3.5 machines.
  14.  (02/11/97)     Dragging with nothing selected selects the whole string.
  15.  Version 0.06 - Doesn't put a CR on the end of the text!
  16.  (27/7/98)
  17.  Version 0.07 - Doesn't quit if you release the keys while swiping.
  18.  (04/9/98)      Easier to change the keys.
  19.  Version 0.08 - Double clicking now actually claims the clipboard
  20.  (15/9/98)      (thanks to Jonathan Hunt for spotting this!).
  21.                 Might work on pre-3.5 machines.
  22.                 Saved scrap files now typed to Text.
  23.  Version 0.09 - Releasing keys while dragging text icon doesn't abort
  24.  (25/10/98)     the drag (needed for old versions of Zap).
  25.  Key numbers can be found in the StrongHelp manual:
  26.  OS -> OS -> Claim -> vector number -> EventV -> Event number
  27.  -> Key transition -> key number
  28. ',HotKey1 = 76 : 
  29.  Default 76 = Left Shift
  30. (*HotKey2 = 94 : 
  31.  Default 94 = Left Alt
  32. $+" (error code "+
  33.  messages 28
  34. -)messages!0=&400c2 : 
  35.  task initialise
  36. messages!4=&f
  37. messages!8=&10
  38. messages!12=1
  39. messages!16=2
  40. messages!20=3
  41. messages!24=0
  42.  swipe_text 256
  43. ?swipe_text=0
  44.  TASK 4
  45. $TASK="TASK"
  46.  "Wimp_Initialise",300,!TASK,"Swipe",messages 
  47.  WimpVersion%,Task_Handle%
  48. =5Swipe_Box%=-1 : 
  49.  window handle (not created yet)
  50. assembler
  51. @8Clipboard_Data$=
  52. 13 : 
  53.  (we don't own the clipboard)
  54.  block 256
  55. Finished=
  56. E(Dragging=
  57.  : Swiping=1 : Text_Icon=2
  58.  Dragging=Swiping 
  59.  Mask=1<<22 
  60.  Mask=(1<<22)+1
  61.  "Wimp_Poll",Mask,block,,poll_word 
  62.  Reason%
  63.  Reason% 
  64. J7    
  65.  0     : 
  66.  Dragging = Swiping 
  67. null_drag_box
  68. K#    
  69.  1     : 
  70. redraw_swipe_box
  71. L7    
  72.  6     : 
  73. mouse_click(block!0,block!4,block!8)
  74.  7     : 
  75. drag_box
  76.  13    : 
  77. do_our_job
  78. O)    
  79.  17,18 : 
  80. user_message(block!16)
  81.  Finished
  82.  "OS_Release",&10,key_event,0 : 
  83.  remove our code from the event vector
  84.  "OS_Byte",13,11              : 
  85.  disable key events
  86.  "OS_Module",7,,RMA_block     : 
  87.  remove our code from the RMA
  88.  "Wimp_CloseDown",Task_Handle%,!TASK
  89. assembler
  90. Length%=88
  91.  this code can be called at any time so it must go in the module area
  92.  "OS_Module",6,,,Length% 
  93.  ,,RMA_block
  94. P%=RMA_block
  95. L%=RMA_block+Length%
  96. `,sp=13:lk=14:
  97.  define some register names
  98.   [OPT 8
  99.    .key_status
  100.     equd    3
  101.    .poll_word
  102. f:    equd    0           ;(1 = close box, 2 = open box)
  103.     ; => r0 = event type
  104.    .key_event
  105. j3    teq     r0,#11                  ;key event?
  106. k=    movnes  pc,lk                   ;no - not for us then
  107.     stmfd   (sp)!,{r0,lk}
  108. m2    teq     r2,#HotKey1             ;L-Shift ?
  109. n;    moveq   r14,#1                  ;yes - change bit 0
  110. oD    movne   r14,#2                  ; no - change bit 1 (if any)
  111. p0    teqne   r2,#HotKey2             ;L-Alt ?
  112. qL    ldmnefd (sp)!,{r0,pc}^          ;not one of our keys - pass event on
  113.     ldr     r0,key_status
  114. s8    teq     r1,#1                   ;key down event?
  115.     biceq   r14,r0,r14
  116. u=    orrne   r14,r0,r14              ;r14 = new key status
  117.     str     r14,key_status
  118. w;    teq     r14,#0                  ;all keys now down?
  119. xA    teqne   r0,#0                   ;no - all keys were down?
  120. yO    ldmnefd (sp)!,{r0,pc}^          ;no - just update key_status and return
  121.     add     r14,r1,#1
  122. {:    str     r14,poll_word           ;set the poll word
  123. |:    ldmfd   (sp)!,{r0,pc}^          ;pass the event on
  124.  "OS_Byte",14,11             : 
  125.  enable key events
  126.  "OS_Claim",&10,key_event,0  : 
  127.  add our code to the event vector
  128. do_our_job
  129. Action=!poll_word
  130. !poll_word=0
  131.  Action 
  132.  1 : 
  133. close_swipe_box
  134.  2 : 
  135. open_swipe_box
  136. close_swipe_box
  137.  Swipe_Box%<>-1 
  138.   !block=Swipe_Box%
  139.  "Wimp_DeleteWindow",,block
  140.   Swipe_Box%=-1
  141.  Dragging = Swiping 
  142.   Dragging = 
  143.  "Wimp_DragBox",, -1
  144. open_swipe_box
  145.  "Wimp_GetPointerInfo",,block
  146. 1$swipe_text=
  147. read_data(block!12,block!16)+
  148.  ?swipe_text<32 
  149.  $swipe_text="(Adjust to paste)"
  150. close_swipe_box
  151.  (scan string to find width)
  152.  Width=
  153. width($swipe_text)+32
  154.  X,Y,Z
  155. win_def=block+4
  156. +win_def!0=X-32         : win_def!4=Y-32
  157. ,win_def!8=X+Width+64-32: win_def!12=Y+32
  158. )win_def!16=-8-64       : win_def!20=0
  159. 1win_def!24=-1          : win_def!28=&80000000
  160. /win_def!32=&01070207   : win_def!36=&0c0103
  161. +win_def!40=-8-64       : win_def!44=-64
  162. )win_def!48=Width       : win_def!52=0
  163. >win_def!56=&27000000   : win_def!60=10<<12 : 
  164.  button type
  165. )win_def!64=1           : win_def!68=0
  166. .win_def!84=1 : 
  167.  only icon (the save icon)
  168. +win_def!88=-72         : win_def!92=-60
  169. +win_def!96=-8          : win_def!100=-4
  170. :win_def!104=&1700301a  : $(win_def+108)="small_fff"+
  171.  "Wimp_CreateWindow",,win_def 
  172.  Swipe_Box%
  173. !block=Swipe_Box%
  174.  "Wimp_OpenWindow",,block
  175. !Swipe_From=-100:Swipe_To=-100
  176. read_data(Win%,Icon%)
  177.  Icon%=-4 
  178. read_title(Win%)
  179. block!12=Win%
  180. block!16=Icon%
  181.  "Wimp_GetIconState",,block+12 : 
  182.  get info on icon under pointer
  183. Flags=block!36
  184.  Flags 
  185.  Flags 
  186.  1<<8 
  187.  data is indirected
  188.  "Wimp_SendMessage",19,block,block!12,block!16 
  189.  ,,Her_Handle%
  190.  "XWimp_TransferBlock",Her_Handle%,block!40,Task_Handle%,block,255 
  191.  1<<28 
  192.  Data$=
  193.  Data$=
  194. strip(block)
  195.  data is not indirected
  196.   block?52=0
  197.   Data$=
  198. strip(block+40)
  199. =Data$
  200. read_title(Win%)
  201. !block=Win%
  202.  "Wimp_GetWindowInfo",,block+1
  203. Flags=block!60
  204.  Flags 
  205.  Flags 
  206.  1<<8 
  207.  data is indirected
  208.  "Wimp_SendMessage",19,block,Win% 
  209.  ,,Her_Handle%
  210.  "XWimp_TransferBlock",Her_Handle%,block!76,Task_Handle%,block,255 
  211.  1<<28 
  212.  Data$=
  213.  Data$=
  214. strip(block)
  215.  data is not indirected
  216.   block?88=0
  217.   Data$=
  218. strip(block+76)
  219. =Data$
  220. user_message(Message%)
  221.  Message% 
  222.  0      : Finished=
  223.  1      : 
  224. load_clipboard
  225.  2      : 
  226. data_save_ack
  227.  3      : 
  228. load_clipboard2
  229.  &f     : 
  230. other_claims_clipboard
  231.  &10    : 
  232. data_request
  233.  &400c2 : 
  234. strip(block+28)="Swipe" 
  235.  block!4<>Task_Handle% 
  236.                    Finished=
  237.                 
  238. strip(Addr%)
  239.     I$=""
  240.  ?Addr%>31 
  241. (I$)<255
  242.   I$+=
  243. ?Addr%
  244.   Addr%+=1
  245. say(Message$)
  246.  "Wimp_ReportError","xxxx"+Message$,%101,"Swipe"
  247. redraw_swipe_box
  248. icon=block+64
  249.  "OS_ReadModeVariable",-1,4 
  250.  ,,XEig%
  251. !icon!0=-2<<XEig% : icon!4=-64
  252.  icon!8=Width     : icon!12=0
  253. icon!16=&17000111
  254. icon!20=swipe_text
  255. icon!24=-1
  256.  "Wimp_RedrawWindow",,block 
  257.  Flag
  258. /XMin=Swipe_From+block!4-block!20+(1<<XEig%)
  259. Eor_Col=
  260. choose_col
  261.  Flag<>0
  262.  "Wimp_PlotIcon",,icon
  263.  3,Eor_Col
  264.  XMin,block!8,Swipe_To-Swipe_From,block!16-block!8
  265.  "Wimp_GetRectangle",,block 
  266.  Flag
  267. invert
  268. block!0=Swipe_Box%
  269. block!8=-64
  270.  Swipe_From>Swipe_To 
  271.   block!4=Swipe_To+4
  272.   block!12=Swipe_From
  273.   block!4=Swipe_From
  274.   block!12=Swipe_To+4
  275. block!16=0
  276.  "Wimp_UpdateWindow",,block 
  277.  Flag
  278. /XMin=Swipe_From+block!4-block!20+(1<<XEig%)
  279. Eor_Col=
  280. choose_col
  281.  Flag<>0
  282.  3,Eor_Col
  283.  XMin,block!8,Swipe_To-Swipe_From,block!16-block!8
  284.  "Wimp_GetRectangle",,block 
  285.  Flag
  286. mouse_click(X%,Y%,Buttons%)
  287.  block!16=0 
  288. drag_icon:
  289.  Buttons% 
  290.  &100 : 
  291. paste
  292.  &4   : 
  293. select_word
  294.  &40  : 
  295. start_swipe
  296. select_word
  297. !block=Swipe_Box%
  298.  "Wimp_GetWindowState",,block
  299. Win_MiX=block!4
  300. Win_MiY=block!8
  301. Win_MaX=block!12
  302. Win_MaY=block!16
  303. invert
  304.  "OS_ReadModeVariable",-1,4 
  305.  ,,XEig%
  306. 9-Swipe_From=X%-block!4-(2<<XEig%)+block!20
  307. ; Index=
  308. get_index(Swipe_From)
  309. Index_To=Index
  310.  Index>0 
  311. alpha(
  312. $swipe_text,Index,1))
  313.   Index-=1
  314.  Index_To<
  315. ($swipe_text) 
  316. alpha(
  317. $swipe_text,Index_To+1,1))
  318.   Index_To+=1
  319. D*Swipe_From=
  320. width(
  321. $swipe_text,Index))
  322. E+Swipe_To=
  323. width(
  324. $swipe_text,Index_To))
  325. invert
  326. I8Clipboard_Data$=
  327. $swipe_text,Index+1,Index_To-Index)
  328. block!0=24
  329. block!12=0
  330. block!16=&f
  331. N%block!20=1<<2 : 
  332.  claim clipboard
  333.  "Wimp_SendMessage",17,block,0
  334. alpha(Char$)
  335.  Char$>="A" 
  336.  Char$<="Z" 
  337.  Char$>="a" 
  338.  Char$<="z" 
  339.  Char$>="0" 
  340.  Char$<="9" 
  341. start_swipe
  342. !block=Swipe_Box%
  343.  "Wimp_GetWindowState",,block
  344. Win_MiX=block!4
  345. Win_MiY=block!8
  346. Win_MaX=block!12
  347. Win_MaY=block!16
  348. invert
  349.  "OS_ReadModeVariable",-1,4 
  350.  ,,XEig%
  351. b-Swipe_From=X%-block!4-(2<<XEig%)+block!20
  352. d Index=
  353. get_index(Swipe_From)
  354. Index_To=Index
  355. Swipe_To=Swipe_From
  356. invert
  357. block!4=7
  358. block!8=X%  : block!12=Y%
  359. block!16=X% : block!20=Y%
  360. m)block!24=Win_MiX+8 : block!28=Win_MiY
  361. n)block!32=Win_MaX   : block!36=Win_MaY
  362.  "Wimp_DragBox",,block
  363. Dragging=Swiping
  364.  round XPos to a letter boundary
  365. get_index(
  366.  XPos)
  367.  Index,WFont%
  368.  WimpVersion% >= 350 
  369.  "Wimp_ReadSysInfo",8 
  370.  WFont%
  371. z'  WFont% = 0 : 
  372.  System font always
  373.  WFont%=0 
  374.  XPos<0 
  375.  XPos=0
  376. ~:  Index=XPos>>4 : 
  377.  offset of first letter into string
  378.  Index>
  379. ($swipe_text) 
  380.  Index=
  381. ($swipe_text)
  382.   XPos=Index<<4
  383.  XPos<0 
  384.  XPos=0
  385.  "Font_ScanString",WFont%,swipe_text,(1<<8),XPos*400,&fff 
  386.  ,Index,,end
  387.   Index-=swipe_text
  388.   XPos=end/400
  389. =Index
  390. null_drag_box
  391.  "Wimp_GetPointerInfo",,block
  392. Old_Swipe_To=Swipe_To
  393. Swipe_To=block!0+block!20
  394. block!0=Swipe_Box%
  395.  "Wimp_GetWindowState",,block
  396. Swipe_To-=block!4
  397. !Index_To=
  398. get_index(Swipe_To)
  399.  Old_Swipe_To=Swipe_To 
  400.  Swipe_To,Old_Swipe_To
  401. invert
  402.  Swipe_To,Old_Swipe_To
  403. invert
  404. drag_box
  405.  Dragging 
  406.  Text_Icon
  407. '    
  408.  "Wimp_GetPointerInfo",,block
  409. /    block!20=block!12 : 
  410.  dest window, icon
  411.     block!24=block!16
  412.     block!16=1 : 
  413.  DataSave
  414. #    block!36=
  415. (Clipboard_Data$)
  416.     block!40=&fff
  417. #    $(block+44)="SwipedText"+
  418.     block!0=56
  419.     block!12=0
  420. 8    
  421.  "Wimp_SendMessage",17,block,block!20,block!24
  422.  Swiping
  423. ,    
  424.  Index_To<Index 
  425.  Index,Index_To
  426. <    Clipboard_Data$=
  427. $swipe_text,Index+1,Index_To-Index)
  428.     block!0=24
  429.     block!12=0
  430.     block!16=&f
  431. )    block!20=1<<2 : 
  432.  claim clipboard
  433. (    
  434.  "Wimp_SendMessage",17,block,0
  435. Dragging=
  436. other_claims_clipboard
  437.  ((block!20) 
  438.  (1<<2)) 
  439.  block!4<>Task_Handle% 
  440.  Clipboard_Data$=
  441. data_request
  442.  ((block!36) 
  443.  (1<<2))=0 
  444.  Clipboard_Data$=
  445.  we don't own the clipboard
  446. block!0=52
  447. block!12=block!8
  448. block!16=1
  449. block!36=
  450. (Clipboard_Data$)
  451. block!40=&fff
  452. $(block+44)="Swiped"+
  453.  "Wimp_SendMessage",17,block,block!4
  454. data_save_ack
  455. SavePath$=
  456. strip(block+44)
  457. (SavePath$)
  458. #C,Clipboard_Data$;
  459.  "SetType "+SavePath$+" Text"
  460. block!12=block!8
  461. block!16=3
  462. block!36=
  463. (Clipboard_Data$)
  464.  "Wimp_SendMessage",17,block,block!4
  465. paste
  466.  Clipboard_Data$<>
  467.  we own the clipboard, so this'll be easy
  468.  A%=1 
  469. (Clipboard_Data$)
  470. 4    
  471.  "OS_Byte",&99,0,
  472. Clipboard_Data$,A%,1))
  473.  send a request for the clipboard data
  474.   block!0=48
  475.   block!12=0
  476.   block!16=&10
  477.   block!20=-1
  478.   block!24=-1
  479.   block!36=4
  480. ,  block!40=&fff : 
  481.  we only want text...
  482.   block!44=-1
  483.  "XWimp_SendMessage",17,block,0
  484. load_clipboard
  485.  block!4=Task_Handle% 
  486. block!0=60
  487. block!12=block!8
  488. block!16=2
  489. block!36=-1
  490. !$(block+44)="<Wimp$Scrap>"+
  491.  "Wimp_SendMessage",17,block,block!4
  492. load_clipboard2
  493. strip(block+44))
  494.  C=0 
  495.   B%=
  496.  B%=10 
  497.  B%=13
  498.  "OS_Byte",&99,0,B%
  499.  "Remove "+
  500. strip(block+44)
  501. choose_col
  502.  "OS_ReadModeVariable",-1,3 
  503.  ,,Colours%
  504.  Colours%>16 
  505.  =63 
  506. drag_icon
  507. 4block!8=block!0  : 
  508.  drag box is the click point
  509. block!12=block!4
  510.  "DragASprite_Start",%1000101,1,"small_fff",block
  511. Dragging=Text_Icon
  512.  Swipe_From<0 
  513.  nothing selected - select everything
  514. !  Clipboard_Data$=$swipe_text
  515. invert:
  516.  just in case
  517. )  Index=0:Index_To=
  518. (Clipboard_Data$)
  519.   Swipe_From=0
  520.     &  Swipe_To=
  521. width(Clipboard_Data$)
  522. invert
  523.   block!0=24
  524.   block!12=0
  525.   block!16=&f
  526. '  block!20=1<<2 : 
  527.  claim clipboard
  528.  "Wimp_SendMessage",17,block,0
  529. width(S$)
  530.  WFont%,Width%
  531.  WimpVersion% >= 350 
  532.  "Wimp_ReadSysInfo",8 
  533.  WFont%
  534. '  WFont% = 0 : 
  535.  System font always
  536.  WFont%=0 
  537. (S$)<<4
  538.  "Wimp_TextOp",1,S$,0 
  539.  Width%
  540. =Width%
  541.